<?php

namespace app\api\controller\v1;

use app\api\validate\IDMustBePositiveInt;
use app\api\model\Banner as BannerModel;
use app\lib\exception\BannerMissException;
use think\Exception;

class Banner
{
	/**
	 * 获取指定的id的banner信息
	 * @url　/banner/:id
	 * @http GET
	 * @id banner的id号
	 */
	public function getBanner($id)
	{
		// AOP  面向切面编程
		(new IDMustBePositiveInt())->goCheck(); //类似于拦截器。

		// 异常处理流程
		// 抛出异常，并自定义异常信息
		// 
		// 优秀的开源代码：代码越抽象，它的复用性就越高；封装性越好，然后它适应代码变化的能力就越强。

		// 模型层操作
		// 1.推荐使用静态化方法<<<
		// $banner = BannerModel::get($id);//调用model模型层中的get方法
		//get, find, all, select.     get与all是模型对象特有的。Db类是没有的。

		// 查询关联表数据
		// $banner = BannerModel::with('items')->find($id);
		// $banner = BannerModel::with(['items','items1'])->find($id);  //多个关联数据表的写法
		// 一个简单的业务代码，查询……最好是放到model中进行封装，方便复用与调用。
		// $banner = BannerModel::with(['items', 'items.img'])->find($id);//嵌套关联关系,关联到image表

		// 2.通过实例化模型。
		// $banner = new BannerModel;
		// $banner = $banner->get($id);

		// 这种代码的可读性比较强
		$banner = BannerModel::getBannerByID($id);   //调用模型中对业务代码封装的静态方法
		// 用最笨的方法，尝试删除一些字段。不建议使用这种方法。
		// $data = $banner->toArray();
		// unset($data['delete_time']);
		// $banner = BannerModel::getBannerByID__test($id); //调试使用。
		// $banner->hidden(['update_time', 'delete_time']);  //推荐使用这种方法来，隐藏掉不需要的字段。
		// $banner->visible(['id', 'update_time']);//只显法某些字段

		// if(!$banner){ //异常抛出，不打断思路
		if($banner->isEmpty()){
			throw new BannerMissException();//抛出异常
			// throw new Exception('内部错误');//发关系统内部错误异常，调试使用。
		}

		// $c = config('setting.img_prefix');//获取自定义图片路径的前缀
		// dump($c);

		// return json($banner, 200);//默认为200，可以不填写。
		return $banner;//使用模型层后，不用json序列化，直接返回即可。

		// return $data;//测试数组删字段，最笨方法。
	}


	public function getBanner_test($id, $version)
	{
		// 开闭原则，如果修改一个代码，就用其它地方新增扩展的形式。
		// 修改代码的话，就必须是封闭的。
		// 每一个版本，制作一个单独的模块。

		// 普通开发者的版本控制写法
		if($version == 1){
			// AOP 面向切面编程
			(new IDMustBePositiveInt())->goCheck();

			$banner = BannerModel::getBannerByID($id);
			// if(!$banner){
			if($banner->isEmpty()){
				throw new BannerMissException();
			}
			return $banner;
		}
		if($version == 2){
			//.....
		}
		if($version == 3){
			//.....
		}

	}
}